package com.telit.firecommand.service;

import com.telit.common.entity.PageData;
import com.telit.firecommand.dto.CameraFirePointDTO;
import com.telit.firecommand.dto.DistrictCountDTO;
import com.telit.firecommand.entity.CommCameraInfo;
import com.telit.firecommand.model.camera.QryDistrictListByCodesRequest;
import com.telit.firecommand.vo.CameraVO;
import com.telit.firecommand.vo.FirePointResourceVO;

import java.util.List;


/**
 * 监控设备信息
 *
 * @author yuezhuang
 * @date 2022-08-30
 */
public interface CameraInfoService {

    /**
     * 增
     *
     * @param commonCameraInfo
     */
    void addCamera(CommCameraInfo commonCameraInfo);

    /**
     * 删
     *
     * @param ids
     */
    void deleteById(List<Long> ids);

    /**
     * 改
     *
     * @param commonCameraInfo
     */
    void updateById(CommCameraInfo commonCameraInfo);

    /**
     * 查
     *
     * @param id
     *
     * @return
     */
    CommCameraInfo queryById(Long id);

    /**
     * 首页获取监控列表
     *
     * @param districtCode 行政区划
     *
     * @return 监控列表
     */
    List<CameraVO> getCameraPosition(String districtCode);

    /**
     * 根据父行政区划编码查询子类集合
     * <p>
     * 监控挂在区、县下面，所以区县是叶子节点了。行政区划编码长度是6
     * </p>
     *
     * @param type         监控类型 1防火监控2防盗监控3卡口监控
     * @param online       在线  1在线 0离线
     * @param cameraName   监控名称（模糊查询）
     * @param districtCode 父行政区划编码
     *
     * @return DistrictCountDTO Obj
     */
    DistrictCountDTO qryDistrictListByParentCode(Integer type, Integer online, String cameraName, String districtCode);

    /**
     * 根据行政区划编码批量查询
     *
     * @param qryDistrictListByCodesRequest qryDistrictListByCodesRequest
     *
     * @return 行政区划+数量+监控列表
     */
    DistrictCountDTO qryDistrictListByCodes(QryDistrictListByCodesRequest qryDistrictListByCodesRequest);

    /**
     * 根据火点信息查询实时视频
     *
     * @param districtCode 行政区划编码
     * @param fireId       火情id
     * @param firePoint    point(经纬+纬度)
     *
     * @return 监控集合
     */
    @Deprecated
    List<CameraVO> qryCameraListByPoint(String districtCode, String fireId, String firePoint);

    /**
     * 根据火点信息查询资源
     *
     * @param districtCode 行政区划编码
     * @param firePoint    point(经纬+纬度)
     * @param keyWords     搜索关键字
     *
     * @return FirePointResourceVO
     */
    FirePointResourceVO qryResourceListByPoint(String districtCode, String firePoint, String keyWords);

    /**
     * 缓存火场态势首页实时视频
     *
     * @param districtCode 行政区划编码
     * @param fireId       火情id
     * @param cameraVO     监控信息
     */
    @Deprecated
    void cacheCameraByPoint(String districtCode, String fireId, CameraVO cameraVO);

    /**
     * 缓存火场态势首页资源
     *
     * @param districtCode        行政区划编码
     * @param fireId              火情id
     * @param firePointResourceVO 资源信息
     */
    void cacheResourceByPoint(String districtCode, String fireId, FirePointResourceVO firePointResourceVO);

    /**
     * 根据火点信息查询缓存资源
     *
     * @param districtCode 行政区划编码
     * @param fireId       火情id
     * @param firePoint    point(经纬+纬度)
     *
     * @return FirePointResourceVO
     */
    FirePointResourceVO qryCacheResourceByPoint(String districtCode, String fireId, String firePoint);

//    /**
//     * 监控列表查询
//     */
//    List<CameraVO> pageList(String districtCode, Integer pageNum, Integer pageSize, Integer type, Integer online,
//                            String cameraName);

//    /**
//     * 查询监控详情
//     */
//    Object findOne(String id);

    /**
     * 根据父行政区划编码查询子类数量
     * <p>
     * 监控挂在区、县下面，所以区县是叶子节点了。行政区划编码长度是6
     * </p>
     *
     * @param type         监控类型 1防火监控2防盗监控3卡口监控
     * @param online       在线  1在线 0离线
     * @param cameraName   监控名称（模糊查询）
     * @param districtCode 父行政区划编码
     *
     * @return DistrictCountDTO Obj
     */
    DistrictCountDTO qryNumByParentCode(Integer type, Integer online, String cameraName, String districtCode);

    /**
     * 分页查询监控列表
     *
     * @param pageNo       当前页数
     * @param pageSize     每页条数
     * @param noPage       是否不分页 true-不分页
     * @param type         监控类型 1防火监控2防盗监控3卡口监控
     * @param online       在线  1在线 0离线
     * @param cameraName   监控名称（模糊查询）
     * @param districtCode 父行政区划编码
     *
     * @return PageData
     */
    PageData<List<CameraVO>> qryListByParentCode(Integer pageNo, Integer pageSize, boolean noPage, Integer type,
                                                 Integer online, String cameraName, String districtCode);

    /**
     * 查询详情
     *
     * @param id id
     *
     * @return CameraVO
     */
    CameraVO info(String id);

    /**
     * 查询详情
     *
     * @param id   id
     * @param code code
     *
     * @return CameraVO
     */
    CameraVO qryInfo(String id, String code);

    /**
     * 通过cameraIndexCode查询监控详情
     *
     * @param cameraIndexCode
     *
     * @return
     */
    CommCameraInfo queryByCameraIndexCode(String cameraIndexCode);

    /**
     * 分页条件查询监控设备
     *
     * @param districtName
     * @param name
     * @param current
     * @param size
     *
     * @return
     */
    PageData<Object> listByPage(String districtName, String monitoringType, String name, Integer current, Integer size,
                                String deviceStatus);


    int countCamera(String districtCode,String type,String deviceStatus);

    /**
     * 查
     * @param id
     * @return
     */
//    CommCameraInfo queryById(Long id);

    List<CameraFirePointDTO> queryListByPoint(String firePoint, Long fireId, String districtCode);

    /**
     * 条件查询
     * @param keyWord
     * @param deviceStatus
     * @param flag
     */
    List<CommCameraInfo> queryByCondition(String keyWord, String deviceStatus, String monitoringType, String flag);


    void updateCameraOnlineInfo();
}
